package xyz.zdsoft.auth_module.utils;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.boot.system.ApplicationHome;
import xyz.zdsoft.common.utils.Result;
import xyz.zdsoft.common.utils.FileUtils;
import xyz.zdsoft.common.utils.JwtUtils;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CheckCode {

    public static String checkId = "";


    public static Color getRandColor(int fc,int bc){
        Random random = new Random();
        if(fc > 255){
            fc = 255;
        }
        if(bc < 255){
            bc = 255;
        }
        int r = fc +random.nextInt(bc-fc);
        int g = fc +random.nextInt(bc-fc);
        int b = fc +random.nextInt(bc-fc);

        return new Color(r,g,b);
    }

    public static void getImage(HttpServletResponse response){
        //设置页面不缓存
        response.setHeader("Pragma","no-cache");
        response.setHeader("Cache-Control","no-catch");
        response.setDateHeader("Expires",0);
        response.setHeader("Access-Control-Expose-Headers","token");

        //在内存中创建图象
        int width = 120;
        int height = 40;
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        //创建图象
        Graphics g = image.getGraphics();
        //生成随机对象
        Random random = new Random();
        //设置背景色
        g.setColor(getRandColor(200,250));
        g.fillRect(0,0,width,height);
        //设置字体
        g.setFont(new Font("Tines Nev Roman",Font.PLAIN,30));  //18
        //随机产生干扰线
        g.setColor(getRandColor(160,200));
        for(int i = 0; i < 255; i++){
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x,y,x+xl,y+yl);
        }
        //随机产生认证码,4位数字
        String sRand = "";
        for(int i = 0; i < 4; i++){
            String rand = String.valueOf(random.nextInt(10));
            sRand  += rand;
            //将认证码显示到图象中
            g.setColor(new Color(40 + random.nextInt(110),40 + random.nextInt(110),40 + random.nextInt(110)));
            g.drawString(rand,30*i+6,32);
        }
        //图像生效
        g.dispose();
        checkId = JwtUtils.getJwtCheckToken(sRand);
        System.out.println("checkcode："+sRand);
        System.out.println("checkId："+checkId);
        try {
            response.setHeader("token",checkId);
            ImageIO.write(image,"JPEG",response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    public static Result getCodeId(){
        return Result.ok().data(new yzCode1(checkId));
    }

    @AllArgsConstructor
    @Data
    public static class yzCode1{
        private String checkId;
    }


    public static Result getImage(HttpSession session,ApplicationHome h){
        //在内存中创建图象
        int width = 120;
        int height = 40;
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        //创建图象
        Graphics g = image.getGraphics();
        //生成随机对象
        Random random = new Random();
        //设置背景色
        g.setColor(getRandColor(200,250));
        g.fillRect(0,0,width,height);
        //设置字体
        g.setFont(new Font("Tines Nev Roman",Font.PLAIN,30));  //18
        //随机产生干扰线
        g.setColor(getRandColor(160,200));
        for(int i = 0; i < 255; i++){
            random.nextInt(width);
            random.nextInt(height);
            random.nextInt(12);
            random.nextInt(12);
        }
        //随机产生认证码,4位数字
        String sRand = "";
        for(int i = 0; i < 4; i++){
            String rand = String.valueOf(random.nextInt(10));
            sRand  += rand;
            //将认证码显示到图象中
            g.setColor(new Color(40 + random.nextInt(110),40 + random.nextInt(110),40 + random.nextInt(110)));
            g.drawString(rand,30*i+6,32);
           /*if(i==3){
               session.setAttribute("rCode",sRand);
           }*/
        }
        //图像生效
        g.dispose();
//       保存到硬盘上
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        int random1 = random.nextInt(9999);
        String fileName = sdf.format(new Date())+random1;
        String dirPath = FileUtils.getCheckCodePath(h);
        String codePath = dirPath+fileName+".jpg";
        System.out.println(codePath);
        System.out.println(fileName);
        String token = JwtUtils.getJwtToken(sRand,"test");
//       session.setAttribute(fileName,sRand);
//       session.setMaxInactiveInterval(180);
        try {
            ImageIO.write(image,"jpg",new File(codePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(sRand);
        return Result.ok().data(new yzCode(fileName+".jpg",token));
    }


    @AllArgsConstructor
    @Data
    public static class yzCode{
        private String filePath;
        private String checkId;
    }
}